#help#	Selecting this menu item will configure the



#ident "@(#)pci    1/25/95"

PRONAME="RTL PCI"
BRDNAME="RTL PCI"
BASENAME="pci"
OS="SCO"

BROADCAST=
NETMASK=
IP=
NEWCONFIG=0
NEWKERNEL=0
MAXBOARDS=4

# Configurable resources

# SCOsetupdevice DRVNAME IP NETMASK BROADCAST
SCOsetupdevice() {

	DRVNAME=$1
	IP=$2
	NETMASK=$3
	BROADCAST=$4
	#
	# Modify streams configuration file
	#
	echo "Modifying /etc/strcf ..."
	cp /etc/strcf /etc/strcf.old
	grep -v "cenetb ip /dev/${DRVNAME} " /etc/strcf.old >/etc/strcf
	ed -s /etc/strcf << PROST > /dev/null
/	loopback/
i
	cenetb ip /dev/${DRVNAME} ${DRVNAME}
.
w
q
PROST



	#
	# Modify TCP/IP startup file /etc/tcp
	#
	echo "Modifying /etc/tcp ..."
	cp /etc/tcp /etc/tcp.old
	grep -v "ifconfig ${DRVNAME} " /etc/tcp.old >/etc/tcp
	ed -s /etc/tcp << PROST > /dev/null
/ifconfig/
a
	ifconfig ${DRVNAME} ${IP} -trailers netmask ${NETMASK} broadcast ${BROADCAST}
.
w
q
PROST

}

# ISCsetupdevice DRVNAME IP NETMASK BROADCAST
ISCsetupdevice() {

	DRVNAME=$1
	IP=$2
	NETMASK=$3
	BROADCAST=$4
	#if [ "${DRVNAME}" != "${BASENAME}" ]
	#then
		#echo ""
		#echo "Host-Based TCP/IP V1.X for ISC Unix does"
		#echo "currently only support one network board."
		#echo "The device /dev/${DRVNAME} is, however, func-"
		#echo "tional.          Press Enter to continue."
		#read dummy
		#return
	#fi

	#
	#  change /etc/netd.cf to use ${DRVNAME}
	#  set the hostname in /etc/netd.cf
	#
	if [ -f /etc/netd.cf ]
	then
		echo "Saving old /etc/netd.cf as /etc/netd.cf.old"
		mv /etc/netd.cf /etc/netd.cf.old
	fi
	echo "Customizing network configuration file /etc/netd.cf ..."
	LOCNAME=`uname -n`
	cp /usr/admin/menu/packagemgmt/tcpipmgmt/hbtcpmgmt/_netd.cf /etc/netd.cf
	chmod  755 /etc/netd.cf
	ed - /etc/netd.cf > /dev/null <<-EOF
		g/DEV/s//${DRVNAME}/g
		g/local_site_name/s//$LOCNAME/
		w
		q
		EOF

	echo "\nConfiguration of TCP/IP for device ${DRVNAME} is complete."
}


#setupstartup
setupstartup() {

   if [ "${OS}" = "SCO" ]
   then
	# Make links to rc directories
	echo "Setting links for automatic TCP/IP startup ..."
	rm -f /etc/rc2.d/S85tcp /etc/rc0.d/K85tcp
	ln /etc/tcp /etc/rc2.d/S85tcp
	ln /etc/tcp /etc/rc0.d/K85tcp
   else
	echo "Raising default runlevel to 3 ...\c"
	chmod  644 /etc/inittab /etc/conf/cf.d/init.base
	ed - /etc/inittab > /dev/null <<-EOF
		1,$ s/is:2:initdefault/is:3:initdefault/g
		w
		q
		EOF
	ed - /etc/conf/cf.d/init.base > /dev/null <<-EOF
		1,$ s/is:2:initdefault/is:3:initdefault/g
		w
		q
		EOF
	chmod  444 /etc/inittab
	chmod  644 /etc/conf/cf.d/init.base
	echo " Done."
   fi

}
#=====================================================================


# addhex(a,b) : add two hexadecimal numbers using awk.
# a and b are ascii strings of digits and the letters a-f
#
# Taken from TCPRT, but works now (try addhex(1234 1234) with
# the one from the TCPRT...)

addhex() {
echo "$1 $2" | nawk ' {
	printf("%x", atoh($1) + atoh($2));
    }
    function atoh(number) {
	i = 0
	j = length(number)
	result = 0
	while ( i < j ) {
	    v = index("123456789abcdef", substr(number,j-i,1)) * (16 ^ i)
	    result = result + int(v + .1)
	    i = i + 1
	}
	return result
    }'
}


# Check whether elem is contained in list
# Return elem on success, "" else
# Format : checklist elem list default

checklist() {
	if [ "$1" = "" ] ; then
		echo $3 ; return 0
	fi
	for opt in $2
	do
		if [ "$opt" = "$1" ] ; then echo $1 ; return 0 ; fi
	done
	return 1
}


# Choose among positions
# Returns choice in variable CHOICE
# Format: choose what list default

choose() {
while [ 1 ]
do
	echo "Valid choices for the $1 are :"
	echo "  $2"

	default=$3
	if [ "${default}" = "" -o "${default}" = "0" ] ; then
		echo "Enter $1 : \c"
		default=""
	else
		echo "Enter $1 [${default}] : \c"
	fi
	read answer
	answer2=`checklist "${answer}" "$2" ${default}`
	case $answer2 in
		"")     if [ "${answer}" = "" ] ; then
			echo "No default - you must enter a value.\n"
			else
			echo "\n${answer} is not a valid choice for the $1.\n"
			fi
			;;
		*)	CHOICE=${answer2}
			NEWCONFIG=1
			break
			;;
	esac

	if [ "${default}" != "${CHOICE}" ] ; then
		NEWCONFIG=1
	fi
done
}

# Get ordinal number
getordinal() {
	case "$1" in
		0)	if [ "${MAXBOARDS}" = "1" ]
			then
				ORDINAL=""
			else
				ORDINAL="first "
			fi
			;;
		1)	ORDINAL="second "
			;;
		2)	ORDINAL="third "
			;;
		3)	ORDINAL="fourth "
			;;
		*)	NUM=`expr $1 + 1`
			ORDINAL="${NUM}th "
			;;
	esac

	echo "${ORDINAL}"
}



# Prompt for yes or no answer with message passed as argument -
# returns non-zero for no
getyn() {
	while	echo "\n$* (y/n/q) \c">&2
	do	read yn rest
		case $yn in
			[yY]) return 0				;;
			[nN]|[qQ]) return 1			;;
		*)	echo "Please answer y,n or q" >&2       ;;
		esac
	done
}



# Disable board
disableboard() {

	# Read current parameters, write them back with cfg=N
	read MOD CFG MINS PRI INF IRQVAL IS IE SHMEMS SHMEME \
				</etc/conf/sdevice.d/${1}
	echo $MOD N $MINS $PRI $INF $IRQVAL $IS $IE $SHMEMS $SHMEME \
				>/etc/conf/sdevice.d/${1}

}



#
# Complete configuration of all parameters in the System file
#
hwconfig() {

tput clear
ORDINAL=`getordinal "$1"`

clear
echo "Configuration of Hardware Parameters for the ${ORDINAL}\c"
echo "${PRONAME} board.\n\n"

#if [ "$1" = "0" ]
#then
#	DRVNAME="${BASENAME}"
#else
	DRVNAME="${BASENAME}$1"
#fi

if [ ! -f /etc/conf/sdevice.d/${DRVNAME} ]
then
	echo "\n\n"
	echo "The driver ${BRDNAME} for the ${ORDINAL}${BRDNAME} adapter"
	echo "is not installed. Please install the ${BRDNAME} driver from"
	echo "your ${PRONAME} driver diskette using installpkg and then"
	echo "run mkdev ${DRVNAME} again.\n\n"
	exit
fi

cp /etc/conf/sdevice.d/${DRVNAME} /tmp/${DRVNAME}.old

# Read current parameter
read MOD CFG MINS PRI INF IRQVAL IS IE SHMEMS SHMEME \
				</etc/conf/sdevice.d/${DRVNAME}


# Check for i/o address range
if [ "${IOAVALS}" != "" ]
then
	# Edit io address
	choose "I/O Address" "${IOAVALS}" $IS
	IS=$CHOICE
        IE=${IS}
	#IE=`addhex ${IS} ${IOAWIN}`
	echo "\nSelected : ${IS} - ${IE}\n\n"
fi


# Check for interrupt options
if [ "${IRQVALS}" != "" ]
then
	# Edit interrupt channel
   #	if [ "${IRQVAL}" = "9" ] ; then
   #		IRQVAL=2
   #	fi
	choose "Interrupt Channel" "${IRQVALS}" ${IRQVAL}
	IRQVAL=${CHOICE}
	echo "\nSelected : ${IRQVAL}\c"
	if [ "${IRQVAL}" = "2" ] ; then
		IRQVAL=9
		echo " (this is translated automatically to IRQ 9)\c"
	fi
	echo "\n\n"
fi


# Update config, set flag to Y
echo "${DRVNAME}\tY\t4\t5\t0\t0\t0\t0\t0\t0" \
				>/etc/conf/sdevice.d/${DRVNAME}

echo "Configuration of Hardware Parameters for the ${ORDINAL}${BRDNAME} board"
echo "driver ${DRVNAME} is complete.\n\n"
}



# Relink the kernel
relink() {
	if [ "${OS}" = "SCO" ]
	then
	#	echo "Executing /etc/conf/bin/idbuild ..."
		/etc/conf/bin/idbuild -y
	else
		/etc/kconfig -r /
	fi
	NEWKERNEL=1
}


# Install new kernel
reboot() {
	echo "\n"
	echo "In order to install the newly built kernel, the"
	echo "system must be shut down and rebooted.\n"
	if getyn "Do you want to reboot now ?"
	then
		# Standard
		cd /
		shutdown -g0
		echo "Shut down the system to reboot with the \c"
		echo "new kernel."
	fi
}

getbroadcast() {
	while	[ 1 ]
	do
		echo "Enter broadcast address [${BROADCAST}] : \c"
		read dummy
		case "${dummy}" in
		"")     break
			;;
		[0-9]*) BROADCAST=$dummy
			break
			;;
		*)	echo "Address must be in IP format, e.g. ${BROADCAST}"
			;;
		esac
	done
}


#
# get netmask for interface
#
getnetmask() {
	while [ 1 ]
	do
		echo "Enter netmask [${NETMASK}] : \c"
		read dummy
		case "${dummy}" in
		[0-9]*) NETMASK=$dummy
			break;
			;;
		"")     break
			;;
		*)	echo "Netmask must be in IP format, e.g. 0.0.255.255"
			;;
		esac
	done
}



# get ip address
#
getipaddr() {
    if [ "${IP}" = "" ]
    then
	while	[ 1 ]
	do	echo "Enter IP address : \c"
		read IP
		case "${IP}" in
		[0-9]*) break
			;;
		*)	echo "Address must be in IP format, e.g. 200.0.0.1"
			;;
		esac
	done
    else
	while	[ 1 ]
	do	echo "Enter IP address [${IP}] : \c"
		read ip
		case "${ip}" in
		[0-9]*) IP=${ip}
			break
			;;
		"")     break;
			;;
		*)	echo "Address must be in IP format, e.g. ${IP}"
			;;
		esac
	done
    fi
}



make_addresses() {
	firstbyte=`/bin/echo ${IP} | sed -e 's/\..*$//'`
	if expr $firstbyte \< 128 > /dev/null ; then
    BROADCAST=`/bin/echo ${IP} | sed -e 's/\(.*\)\..*\..*\..*$/\1.255.255.255/'`
    NETMASK=255.0.0.0
	elif expr $firstbyte \< 192 > /dev/null ; then
    BROADCAST=`/bin/echo ${IP} | sed -e 's/\(.*\..*\)\..*\..*$/\1.255.255/'`
    NETMASK=255.255.0.0
	else
    BROADCAST=`/bin/echo ${IP} | sed -e 's/\(.*\..*\..*\)\..*$/\1.255/'`
    NETMASK=255.255.255.0
	fi
}

installipcfg() {

	echo "\nInstalling ${DRVNAME} device for TCP/IP :"

	# Make sure that hosts file exists
	if [ ! -f /etc/hosts ] ; then
		echo "Creating host file /etc/hosts ..."
		echo "127.0.0.1\tlocalhost\tlocal\tloopback" > /etc/hosts
		chmod 644 /etc/hosts
		chgrp bin /etc/hosts
		chown bin /etc/hosts
	fi

	# Make sure the IP address we got is in the hosts file
	grep $IP /etc/hosts > /dev/null 2>&1 || {
		echo "Updating hostfile with IP number ${IP} ..."
		set `uname -n`
		echo "${IP}\t$1" >> /etc/hosts
		}


	# Setup device operation
	if [ "${OS}" = "SCO" ]
	then
	     SCOsetupdevice $DRVNAME $IP $NETMASK $BROADCAST
	else
	     ISCsetupdevice $DRVNAME $IP $NETMASK $BROADCAST
	fi

}

# TCP/IP configuration for board $1
dotcpipcfg() {

	BRDNUM=$1
#	if [ "${BRDNUM}" = "0" ]
#	then
#		DRVNAME=${BASENAME}
#	else
		DRVNAME="${BASENAME}${BRDNUM}"
#	fi

	ORDINAL=`getordinal "${BRDNUM}"`

	# Preset IP address if empty
	if [ -f /usr/options/cb.name ]
	then
		:
	else
		# SCO
		set `grep "ifconfig ${DRVNAME} " /etc/tcp` >/dev/null
		# /etc/tcp | read dummy dummy IP
		IP=$3
	fi

	while [ 1 ]
	do
	#
	# Get required information
	#

	clear
	echo "Please specify the Internet parameters for the \c"
	echo "${ORDINAL}${BRDNAME}"
	echo "driver ${DRVNAME} .\n"

	getipaddr
	# if [ "${BROADCAST}" = "" ] ; then make_addresses ; fi
	make_addresses
	getbroadcast
	getnetmask

	echo "\n\n"
	echo "The following parameters have been specified"
	echo "for the ${ORDINAL}${BRDNAME} board driver ${DRVNAME} :\n"
	echo "\tIP address        : ${IP}"
	echo "\tBroadcast address : ${BROADCAST}"
	echo "\tNetmask           : ${NETMASK}"
	echo "\n"

	echo "Do you want to (I)nstall, (R)evise or (S)kip the"
	echo "${DRVNAME} driver IP configuration ? (i,r,s) \c"
		while [ 1 ]
		do
			read answer
			case $answer in
				[iI]*)
					installipcfg
					break
					;;
				[rRsS]*)
					break
					;;
				*)	echo "\nPlease answer i,r or s : \c"
					;;
			esac
		done

		case $answer in
			[iIsS]*)
				break
				;;
		esac
	done

}


# Installation routine
if [ -f /usr/options/cb.name ]
then
	OS="ISC"
else
	OS="SCO"
fi

clear
while	echo "Do you wish to install or delete the ${BRDNAME} driver (i/d/q) \c"
do	read ANSWER
	case $ANSWER in
	I|i)
		break
		;;
	D|d)
#		disableboard "${BASENAME}"
		for board in 0 1 2 3 ; do
			disableboard "${BASENAME}${board}"
		done
		cd /
	    if [ "${OS}" = "SCO" ]
	    then
		grep -v ${BASENAME} /etc/tcp > /tmp/tcp && cp /tmp/tcp /etc/tcp
		grep -v ${BASENAME} /etc/strcf > /tmp/strcf && cp /tmp/strcf /etc/strcf
		rm -f /tmp/tcp /tmp/strcf
	    else
		grep -v ${BASENAME} /etc/netd.cf > /tmp/netd.cf && cp /tmp/netd.cf /etc/netd.cf
		grep -v ${BASENAME} /etc/conf/kconfig.d/description > /tmp/description
		cp /tmp/description /etc/conf/kconfig.d/description
		rm -f /tmp/netd.cf  /tmp/description
	    fi
		# Relink the kernel with the new driver information
		if getyn "\nDo you wish to relink the kernel now?"
		then
		  relink
		else
		  echo "\nChanges will not take effect until the kernel is relinked." >&2
		fi
		exit 0
		;;
	Q|q)
		exit 0
		;;
	*)	echo "Please answer 'i', 'd' or 'q'."
		;;
	esac
done

# Disable boards 1,2,3
 for board in 1 2 3 ; do
	 disableboard "${BASENAME}${board}"
 done

# Hardware configuration
index=0
while expr ${index} \< ${MAXBOARDS} >/dev/null
do
	hwconfig $index
	index=`expr $index + 1`

	if [ "${index}" = "${MAXBOARDS}" ] ; then
		break
	fi

	if getyn "Do you want to install another ${BRDNAME} board ?"
	then
		:
	else
		break
	fi
done

numboards=$index

# Special warning...
if [ "${numboards}" != "1" ]
then
	tput clear
	echo "\n\n"
	echo "You have installed more than one ${BRDNAME} board into"
	echo "your system. In order to have TCP/IP use the proper"
	echo "network interface for the desired sub-networks, please"
	echo "make sure that you don't mix up your numbers...\n"
	echo "Things get confusing - please read the documentation"
	echo "that came with your TCP/IP runtime!\n"
fi

# Get nodename, read IP address from hosts file (if any)
system=`uname`
if [ "$system" != "" -a -f /etc/hosts ]
then
	# Get our IP number
	set `grep $system /etc/hosts` >/dev/null 2>&1
	IP=$1
else
	IP=""
fi

# Configure board(s)
index=0
while expr $index \< $numboards >/dev/null
do
	dotcpipcfg $index
	index=`expr $index + 1`
	IP=""
done


setupstartup


echo "\n\n\n\n"
echo "TCP/IP configuration for the ${BRDNAME} driver is complete.\n"

if [ ${NEWCONFIG} ]
then
	echo "In order to update the changed configuration, the"
	echo "UNIX kernel must be relinked and installed.\n"
	if getyn "Do you want to relink the kernel now ?"
	then
		relink
		reboot
	fi
fi

echo "Relink the kernel if necessary and restart the system in order"
echo "to use TCP/IP."
exit 0

